package com.yczlab.mybatis.dao;

import com.yczlab.mybatis.entity.Employee;
import org.apache.ibatis.annotations.*;

import java.util.List;
import java.util.Map;

@Mapper
public interface EmployeeDao {

    /**
     * 通过 employeeId 查询该员工，返回一条数据。
     * 存在单个参数时，Mybatis不会做特殊的处理。甚至在xml映射文件中可以使用#{任意名称}来访问入参，因为就只有单个参数
     * @param employeeId
     * @return Employee
     */
    public Employee findById(int employeeId);

    /**
     * 通过部门id查询相同部门id的员工信息
     * @param depId
     * @return List<Employee>
     */
    public List<Employee> findByDepId(int depId);

    /**
     * 关联查询，按照员工编号查询员工记录。查询员工的同时查询员工对应的部门，即同时将Employee中的department属性封装成相应的Department的javaBean
     * @param employeeId
     * @return Employee
     */
    public Employee findEmpAndDept(Integer employeeId);

    /**
     * 关联查询，按照员工编号查询员工记录。查询员工的同时查询员工对应的部门，即同时将Employee中的department属性封装成相应的Department的javaBean
     * 但是使用分步查询的方法实现
     * @param employeeId
     * @return Employee
     */
    public Employee findEmpAndDeptStep(Integer employeeId);

    /**
     * 通过两个参数查询员工信息，返回一条数据。
     * 存在多个参数时，Mybatis会做一些特殊处理，将入参封装成Map。key为param1，param2......; value为参数值。在xml映射文件中可以使用#{param1},#{param2}来访问
     * 但是可以通过@Param注解指定Mybatis对参数的封装名称，方便使用。这样在xml映射文件中就可以使用#{id},#{lastName}来访问入参了
     * @param employeeId
     * @param lastName
     * @return Employee
     */
    public Employee findByIdAndLastName(@Param("id") Integer employeeId, @Param("lastName") String lastName);

    /**
     * 通过两个参数查询员工信息，返回一条数据。
     * 多个参数也可以直接使用Map进行封装，反正Mybatis都要将多个参数封装成Map
     * @param map
     * @return Employee
     */
    public Employee findByMap(Map<String, Object> map);

    /**
     * 通过员工编号查询一条记录，但是返回Map类型。key:列名，value:值
     * @param employeeId
     * @return Map<String, Object>
     */
    public Map<String, Object> findByIdReturnMap(Integer employeeId);

    /**
     * 查询多天员工记录，并封装成一个Map<Integer, Employee>。key为主键，value为封装后的javaBean
     * 需要使用 @MapKey注解指定javaBean中的具体哪个属性字段作为该Map的key。如果不是主键，也不会报错，但是有重复值时数据会混乱
     * @param nameLike
     * @return Map<Integer, Employee>
     */
    @MapKey("employeeId")
    public Map<Integer, Employee> findEmpsReturnMap(String nameLike);

    /**
     * 查询所有的员工，返回全部数据
     * @return List<Employee>
     */
    public List<Employee> findAll();

    /**
     * 直接使用注解的方式编写sql，查询同姓的员工
     * @param lastName
     * @return List<Employee>
     */
    @Select("select * from employees where last_name=#{lastName}")
    public List<Employee> findByLastName(String lastName);

    /**
     * 添加一条员工记录
     * @param employee
     */
    public boolean addEmployee(Employee employee);

    /**
     * 更新一条员工记录
     * @param employee
     */
    public boolean updateEmployee(Employee employee);

    /**
     * 根据员工id删除该条员工数据
     * @param employeeId
     */
    public boolean deleteEmployee(Integer employeeId);
}
